package tools

import (
	"github.com/golang-jwt/jwt/v4"
	"time"
)

const (
	NormalUser = iota
	Admin
	SuperAdmin
)

var jwtSecret = []byte("thisIsMysteriousData")

type Claims struct {
	ID        int    `json:"id"`
	UserName  string `json:"username"`
	Authority int    `json:"authority"`
	jwt.RegisteredClaims
}

// CreateToken 生成token
func CreateToken(uid int, username string, authority int) (string, error) {
	nowTime := time.Now()
	expireTime := nowTime.Add(24 * time.Hour) // 1小时后过期
	// 创建 JWT 声明对象，包含自定义声明和标准声明
	claims := Claims{
		// 用户的唯一标识符，通常为数据库中的用户 ID
		ID: uid,
		// 用户名，用于标识用户身份
		UserName: username,
		// 用户的权限级别，取值如 NormalUser、Admin、SuperAdmin
		Authority: authority,
		// JWT 的标准声明，包含一些通用的元数据
		RegisteredClaims: jwt.RegisteredClaims{
			// 签发者，标识 JWT 的签发实体，这里为 "myapp"
			Issuer: "myapp",
			// 过期时间，指定 JWT 失效的时间，这里设置为当前时间 24 小时后
			ExpiresAt: jwt.NewNumericDate(expireTime),
			// 生效时间，指定 JWT 开始生效的时间，这里设置为当前时间
			NotBefore: jwt.NewNumericDate(nowTime),
			// 签发时间，指定 JWT 的签发时间，即当前时间
			IssuedAt: jwt.NewNumericDate(nowTime),
			/*
				// 主题，通常用于描述 JWT 的用途，此处留空
				Subject:   "",
				// 受众，指定 JWT 的接收者，此处未指定接收者
				Audience:  nil,
				// JWT 的唯一标识符，用于防止重放攻击，此处留空
				ID:        "",
			*/
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString(jwtSecret)
}

// ParseToken 解析token
func ParseToken(tokenString string) (*Claims, error) {

	// 检查 tokenString 是否为空
	if tokenString == "" {
		return nil, jwt.ErrTokenInvalidClaims
	}

	// 移除 "Bearer " 前缀
	if len(tokenString) > 7 && tokenString[:7] == "Bearer " {
		tokenString = tokenString[7:]
	}

	token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) {
		return jwtSecret, nil
	})
	if token != nil {
		if claims, ok := token.Claims.(*Claims); ok && token.Valid {
			return claims, nil
		}
	}
	return nil, err
}
